/**
 * \brief Estrutura de dados de um Estudante
 * 
 */
# ifndef STUDENT_DEFINITION
# define STUDENT_DEFINITION

# include <stdlib.h>
# include "../../util/lists/linked-list.h"
# include "../../io/logs/logSystem.h"

typedef enum { NORMAL, PROFESSIONAL, EXTRA } StudentType;
typedef struct {
	char *uceName;
	int preference;
} Selection;
typedef struct {
	char *name; // O nome do aluno
	int number; // O número do aluno (Unívoco)
	StudentType type; // Tipo de aluno
	int average; // Número a variar entre 0 e 200
	LinkedList *selections; // Escolhas do aluno
	int year; // ano da 1ª tentativa
	int ucesWanted;
	int uceA; int uceB;
} Student;

/**
 * \brief Aloca espaço em memória para uma estrutura "estudante"
 * \return Estudante
 *
 * Pode crashar!
 */
Student * newStudent();
/**
 * \brief Reserva espaço em memória e inicializa os valores
 * \param uceName Nome da UCE (cuidado.. usar strdup para guardar em memória)
 * \param pref Inteiro representativo da preferencia deste aluno por a uce em causa
 * \return A selecção
 *
 * Pode crashar por falta de memória
 */
Selection * newSelection(char *uceName, int pref);

/**
 * \brief Liberta da memoria a estrutura associada ao aluno
 * \param st Aluno
 */
void freeStudent (Student *st);

/**
 * \brief liberta da memória esta estrurura
 * \param sel Selection
 */
void freeSelection (Selection *sel);

int isFirstSelection (Student *st, char *uce);
char * getNextSelection (Student *st, char *last);

int compareStudent (void *stA, void *stB);
int equalStudent (void *sA, void *sB);
int compareSelection (void *s1, void *s2);
int equalSelection (void *s1, void *s2);

# endif
